//搭配购买
#include <iostream>
using namespace std;
const int MAXN=10000;
const int MAXW=10000;
int n,m,w;
int c[MAXN+1],d[MAXN+1];
int maxd[MAXW+1];
struct node
{
    int head,next,last,size;
};
struct  UFS
{
    node s[MAXN+1];
    void init(){
        for(int i=1;i<=n;i++){
            s[i].head=i;
            s[i].next=0;
            s[i].last=i;
            s[i].size=1;
        }
    }
    int find_set(int x){
        return s[x].head;
    }
    void  addto(int hx,int hy){
        s[s[hx].last].next=hy;
        s[hx].last=s[hy].last;
        s[hx].size+=s[hy].size;
        c[hx]+=c[hy];
        d[hx]+=d[hy];
        while(hy>0){
            s[hy].head=hx;
            hy=s[hy].next;
        }
    }
    void union_set(int x,int y){
        int hx=find_set(x);
        int hy=find_set(y);
        if (hx!=hy){
            if (s[hx].size>s[hy].size) addto(hx,hy);
            else addto(hy,hx);
        }
    }
};
UFS ufs;
int main(){
    cin>>n>>m>>w;
    ufs.init();
    for(int i=1;i<=n;i++) cin>>c[i]>>d[i];
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        ufs.union_set(u,v);
    }
    for(int i=1;i<=n;i++){
        if (ufs.find_set(i)==i){
            for(int v=w;v>=c[i];v--)
                if (maxd[v]<maxd[v-c[i]]+d[i]) maxd[v]=maxd[v-c[i]]+d[i];
        }
    }
    cout<<maxd[w];
}
